<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2016/5/5
 * Time: 6:54
 */
namespace C\lib{


    class Uploads {
        /**
         * --- 默认上传配置 ---
         * @var array
         */
        private static $config = [
            'mimes' => ['image/jpg',"image/jpeg"], //允许上传的文件MiMe类型
            'maxSize' => 83886000 ,           //上传的文件大小限制 (0-不做限制)
            'exts' => ['jpg']         //允许上传的文件后缀
        ];

        /**
         * --- 上传错误信息 ---
         * @var string
         */
        public static $error = ''; //上传错误信息


        /*
         * --- 检查上传的文件 ---
         * @param array $file 文件信息
         */
        private static function check($file) {
            /* 文件上传失败，捕获错误代码 */
            if ($file['error']) {
                self::$error($file['error']);
                return false;
            }

            /* 无效上传 */
            if (empty($file['name'])){
                self::$error = '未知上传错误！';
            }

            /* 检查是否合法上传 */
            if (!is_uploaded_file($file['tmp_name'])) {
                self::$error = '非法上传文件！';
                return false;
            }

            /* 检查文件大小 */
            if (!self::checkSize($file['size'])) {
                self::$error = '上传文件大小不符！';
                return false;
            }

            /* 检查文件Mime类型 */
            if (!self::checkMime($file['type'])) {
                self::$error = '上传文件MIME类型不允许！';
                return false;
            }

            /* 检查文件后缀 */
            if (!self::checkExt($file['ext'])) {
                self::$error = '上传文件后缀不允许';
                return false;
            }

            /* 通过检测 */
            return true;
        }


        /*
         * --- 检查文件大小是否合法 ---
         * @param integer $size 数据
         */
        private static function checkSize($size) {
            return !($size > self::$config['maxSize']) || (0 == self::$config['maxSize']);
        }

        /*
         * 检查上传的文件MIME类型是否合法
         * @param string $mime 数据
         */
        private static function checkMime($mime) {
            return empty(self::$config['mimes']) ? true : in_array(strtolower($mime), self::$config['mimes']);
        }

        /*
         * 检查上传的文件后缀是否合法
         * @param string $ext 后缀
         */
        private static function checkExt($ext) {
            return empty(self::$config['exts']) ? true : in_array(strtolower($ext), self::$config['exts']);
        }

        /*
         * --- 上传文件 ---
         * @param string $userId 用户ID，用于生成文件名
         * @param 文件信息数组 $files ，通常是 $_FILES数组
         */
        public static function uploads($userId ='') {
            if($userId == ''){
                self::$error = '用户未登陆';
                return false;
            }
            // 多文件上传时,检查必须所有文件都上传到服务器才成功
            foreach($_FILES as $file) {
                if($file['tmp_name'] != ''){
                    $file['ext'] = pathinfo($file['name'], PATHINFO_EXTENSION);
                    if(self::check($file)){    // 验证上传文件的格式合法性
                        continue;
                    }else{
                        return false;   // 提示的error信息在 check() 方法中已实现
                    }
                }else{
                    self::$error = '没有上传的文件或文件上传不全';
                    return false;
                }
            }

            // 上传到 OSS 中
            $jFiles = [];
            \C\lib\Oss::connect();
            foreach($_FILES as $key => $file){
                $newFile ='upload/img/'.date('Y').'/'.date('m').'/'.md5($userId.$file['name'].$_SERVER['REQUEST_TIME'].rand(100,999)).'.jpg';
                if(\C\lib\Oss::uploadFile($file['tmp_name'] ,$newFile )){
                    $jFiles[$key] = $newFile;
                }else{
                    //上传oss失败，删除已上传的文件
                    self::$error = '上传OSS失败';
                    foreach($jFiles as $file) {
                        \C\lib\Oss::deleteFile($file);// 删除 OSS 上传成部的部分文件
                    }
                    return false;

                }

            }
            return $jFiles; //上传成功，返回所有 OSS 上存放的文件名
        }
    }

}
